import { Injectable } from '@angular/core';

// 引入 rxjs 需要的模块
import {Observable} from 'rxjs'

@Injectable({
  providedIn: 'root'
})
export class StorageService {
  // 这里是公共服务，所有组件都可以调用
  constructor() { }
  set(key:any,value:any){ //设置数据
    // localStorage.setItem()相当于前段的一个5M大小的数据库，可以将第一次请求的数据直接存储到本地，
    // 当清除缓存时，没了，不清除一直在
    // JSON.stringfy(),将JavaScript 对象转换为字符串 ,因为在向 web 服务器发送数据时，数据必须是字符串。
    localStorage.setItem(key,JSON.stringify(value))
  }

  get(key:any){  //得到数据
    // return "this is service"
    // JSON.parse 将数据转换为 JavaScript 对象。
    return JSON.parse(localStorage.getItem(key))
  }

  remove(key:any){  // 移除数据
    localStorage.removeItem(key)
  }

  // 1、同步方法
  getData()
  {
    alert("我是服务里面的方法") 
  }

  // 2、异步方法
  getCallbackData(cb:any){
    setTimeout(() => {
      var name="张三"

      // 回调函数
      cb(name);
    }, 2000);
  }

  // 3、异步方法2
  getPromiseData(){
    // resolve 代表成功后的结果，reject代表失败后的结果
    return new Promise((resolve,reject)=>{

      setTimeout(() => {
        var name2="张三--pro"
  
        // 回调函数
        resolve(name2)
      }, 2000);

    })
  }

  // 4、rxjs 
  getRxjsData(){
    return new Observable((observer)=>{
      setTimeout(() => {
        var name2="张三--rxjs"
  
        // 回调函数
        observer.next(name2)
        // 失败
        // observer.error('失败了')
      }, 2000);
    })

  }

  // 6、Promise多次执行(没这个能力)
  getPromiseIntervalData(){
    return new Promise((resolve,reject)=>{

      setInterval(() => {
        var name3="张三--pro--执行多次"
  
        // 回调函数
        resolve(name3)
      }, 1000);

    })

  }

  // 7、rxjs执行多次
  getRxjsIntervalData(){
    let count=0
    return new Observable((observer)=>{
      
      setInterval(() => {
        count++
        var name2="张三--rxjs--执行多次--"+count
  
        // 回调函数
        observer.next(name2)
        // 失败
        // observer.error('失败了')
      }, 1000);
    })
  }

  // 8、用工具方法对返回的数据进行处理
  getRxjsNumIntervalData(){
    let count=0
    return new Observable((observer)=>{
      setInterval(() => {
        count++
        // 回调函数
        observer.next(count)
        // 失败
        // observer.error('失败了')
      }, 1000);
    })
  }
}
